package com.aliang.shopping.model.converter;

import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.aliang.shopping.model.dto.common.UpdateStatusDTO;
import com.aliang.shopping.model.dto.goodsSku.GoodsSkuInsertDTO;
import com.aliang.shopping.model.dto.goodsSku.GoodsSkuUpdateDTO;
import com.aliang.shopping.model.po.GoodsSku;
import com.aliang.shopping.model.vo.goods.GoodsSkuVO;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;

import java.util.Collections;
import java.util.List;

/**
 * 商品Sku信息数据转换器
 */
@Mapper(componentModel = "Spring")
public interface GoodsSkuConverter {

    default String getSpecJson(List<Long> specs) {
        if (specs.isEmpty())
            return "[]";
        return JSONUtil.toJsonStr(specs);
    }

    default List<Long> getSpecList(String specs) {
        if (StrUtil.isBlank(specs))
            return Collections.emptyList();
        return JSONUtil.toList(specs, Long.class);
    }

    /**
     * 将商品Sku信息插入数据传输对象转换为商品Sku信息实体
     *
     * @param insertDTO
     * @return
     */
    @Mappings({
            @Mapping(target = "specList", expression = "java( getSpecJson(insertDTO.getSpecList()))")
    })
    GoodsSku toPoByInsertDTO(GoodsSkuInsertDTO insertDTO);

    /**
     * 将商品Sku信息更新数据传输对象转换为商品Sku信息实体
     *
     * @param updateDTO
     * @return
     */
    @Mappings({
            @Mapping(target = "specList", expression = "java( getSpecJson(updateDTO.getSpecList()))")
    })
    GoodsSku toPoByUpdateDTO(GoodsSkuUpdateDTO updateDTO);

    /**
     * 将商品Sku信息更新状态数据传输对象转换为商品Sku信息实体
     *
     * @param updateDTO
     * @return
     */
    @Mapping(target = "isSell",source = "status")
    GoodsSku toPoByUpdateStaticDTO(UpdateStatusDTO updateDTO);

    @Mappings({
            @Mapping(target = "specList", expression = "java( getSpecList(goodsSku.getSpecList()))")
    })
    GoodsSkuVO toVo(GoodsSku goodsSku);

    List<GoodsSkuVO> toVoList(List<GoodsSku> goodsSkuList);
}
